#include "piece.h"

piece::piece(int r,int c)
{
	creatPiece(r,c);
}

piece::piece(const piece & copy)
{
	creatPiece(copy.row,copy.columns);
	for(int j=0;j<row;j++)
		for(int i=0;i<columns;i++)
			*(*(a+j)+i)=copy(i,j);
}

piece::~piece()
{
	deletePiece();
}

void piece::creatPiece(int r, int c)
{
	row=r;
	columns=c;
	a=new int* [row];
	for(int j=0;j<row;j++)
		*(a+j)=new int[columns];
	for(int j=0;j<row;j++)
		for(int i=0;i<columns;i++)
			*(*(a+j)+i)=0;
}

void piece::deletePiece()
{
	for(int j=0;j<row;j++)
		delete [] *(a+j);
	delete [] a;
}

void piece::clearPiece()
{
	for(int j=0;j<row;j++)
		for(int i=0;i<columns;i++)
			*(*(a+j)+i)=0;
}

bool piece::write_To(piece & tar,int x,int y) const
{
	if(x<0||y<0)
		return false;
	for(int j=0;y+j<tar.row&&j<row;j++)
		for(int i=0;x+i<tar.columns&&i<columns;i++)
			tar(x+i,y+j)=*(*(a+j)+i);
	return true;
}

bool piece::read_From(const piece & sou,int x,int y)
{
	if(x<0||y<0)
		return false;
	for(int j=0;j<sou.row&&j+y<row;j++)
		for(int i=0;i<sou.columns&&i+x<columns;i++)
			*(*(a+y+j)+x+i)=sou(i,j);
	return true;
}

bool piece::read_From_soft(const piece & sou,int x,int y)
{
	if(x<0||y<0)
		return false;
	for(int j=0;j<sou.row&&j+y<row;j++)
		for(int i=0;i<sou.columns&&i+x<columns;i++)
			if(*(*(sou.a+j)+i)!=0)
				*(*(a+y+j)+x+i)=sou(i,j);
	return true;
}

bool piece::lost(const piece & sou,int x,int y)
{
	if(x<0||y<0)
		return true;
	int count=0;
	for(int j=0;j<sou.row&&j+y<row;j++)
	{
		for(int i=0;i<sou.columns&&i+x<columns;i++)
		{
			if(*(*(a+y+j)+x+i)!=0&&*(*(sou.a+j)+i)!=0)
				return true;
			if(*(*(sou.a+j)+i)!=0)			//点阵计数
				count++;
		}
	}
	if(count<FULL)						//若丢失某块方块
		return true;
	return false;
}

int & piece::operator () (int i, int j) const
{
	if(j<0||j>=row||i<0||i>=columns)
		return **a;
	return *(*(a+j)+i);
}

piece & piece::operator = (const piece & tar)
{
	if(&tar!=this)
	{
		if(row!=tar.row||columns!=tar.columns)
		{
			deletePiece();
			creatPiece(tar.row,tar.columns);
		}
		for(int j=0;j<row;j++)
			for(int i=0;i<columns;i++)
				*(*(a+j)+i)=tar(i,j);
	}
	return *this;
}
